package es.ucm.fdi.pe.practica3.genetico3.mutacion;

import es.ucm.fdi.pe.practica3.genetico3.Arbol;
import es.ucm.fdi.pe.practica3.genetico3.Individuo;
import es.ucm.fdi.pe.practica3.genetico3.Arbol.Tipo;

public class MutacionTerminal extends Mutacion {

	public void mutar(Individuo i){
		int nodoAMutar=alea_entero(1,i.getArbol().getNum_nodos_hoja());
		//System.out.println("Nodo A mutar:"+nodoAMutar);
		mutar(nodoAMutar-1,i.getArbol());
	}
	
	public int mutar(int n, Arbol a){
		
		if(a.soyTerminal()){
			//System.out.println("Soy terminal");
			if(n==0){
				
				Tipo t;
				//System.out.println("Voy a mutar"+a.getTipo());
				switch(a.getTipo()){
					case AVANZA:
						
						t=Tipo.AVANZA;
						while(t==Tipo.AVANZA){
							t=operandoAleatorio();
						}
						//System.out.println("Por "+t);
						a.setTipo(t);
						break;
					case GIRA_DERECHA:
						t=Tipo.GIRA_DERECHA;
						while(t==Tipo.GIRA_DERECHA){
							t=operandoAleatorio();
						}
						//System.out.println("Por "+t);
						a.setTipo(t);
						break;
					case GIRA_IZQUIERDA:
						t=Tipo.GIRA_IZQUIERDA;
						while(t==Tipo.GIRA_IZQUIERDA){
							t=operandoAleatorio();
						}
						//System.out.println("Por "+t);
						a.setTipo(t);
						break;
					}
			}
			
			else{ 
				n--;
				//System.out.println("Decremento n:"+n);
			}
		}
		else{
			n=mutar(n,a.getHI());
				if(a.tieneHijoCentral())
					n=mutar(n,a.getHC());
				n=mutar(n,a.getHD());
			
		}
		return n;
	}
	
	public static void main(String args[]){
		Individuo i1 = new Individuo(2,3);
		System.out.println(i1.getArbol().recorridoEnProfundidad("   "));
		MutacionTerminal m = new MutacionTerminal();
		m.mutar(i1);
		System.out.println(i1.getArbol().recorridoEnProfundidad("   "));
	}
}
